package com.hb;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

import javax.jms.*;
import javax.xml.soap.Text;

/**
 * 因为这些样板式代码，我们每次使用 JMS 时都要不断地做很多重复工作。更糟糕的是，你会发现我们在重复编写其他开发者的 JMS 代码。
 */
public class TraditionJMSUsage {
    /**
     * 使用传统的 JMS（不使用 Spring）发送消息。
     * 再次声明这是一段失控的代码！就像 JDBC 示例一样，差不多使用了 20 行代码，只是为了发送一条 “Hello world!” 消息。实际上，其中只有几行代码是用来发送消息的，
     * 剩下的代码仅仅是为了发送消息而进行的设置。
     */
    public void traditionSendMessage() {
        ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = null;
        Session session = null;
        try {
            conn = cf.createConnection();
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = new ActiveMQQueue("spitter.queue");
            MessageProducer producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();
            message.setText("Hello World!");
            producer.send(message);
        } catch (JMSException e) {

        } finally {
            try {
                if (session != null) {
                    session.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (JMSException e) {

            }
        }
    }

    /**
     * 使用传统的 JMS（不使用 Spring）接收消息。
     * 与上面一样，下面也是用一大段代码来实现如此简单的事情。如果我们逐行地比较，我们会发现它们几乎是完全一样的。如果查看上千个其他的 JMS 例子，我们会发现它们也是很相似
     * 的。只不过，其中一些会从 JNDI 中获取连接工厂，而另一些则是使用主题代替队列。但是无论如何，它们都大致遵循相同的模式。
     */
    public void readitionReceiveMessage() {
        ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = null;
        Session session = null;
        try {
            conn = cf.createConnection();
            conn.start();
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = new ActiveMQQueue("spitter.queue");
            MessageConsumer consumer = session.createConsumer(destination);
            Message message = consumer.receive();
            TextMessage textMessage = (TextMessage) message;
            System.out.println("GOT A MESSAGE：" + textMessage.getText());
            conn.start();
        } catch (JMSException e) {

        } finally {
            try {
                if (session != null) {
                    session.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (JMSException e) {

            }
        }
    }
}
